The Internet protocol suite is a well known and widely used suite of protocols for servicing data transmissions between two devices communicating information over the Internet. In particular, the Transmission Control Protocol or TCP is a part of the Internet protocol suite that provides for connection-oriented, reliable, and ordered delivery of a stream of information (i.e., payload data) between, for example, a web-browser application running on a client device and a web-server application running on a server device over a local or wide area network.
To communicate with a server device using the TCP protocol, a client device must first establish a TCP connection with the server. After a TCP connection is established, each device may transmit information to the other device in a sequence of discrete data packets, where each data packet contains a header portion and a data portion.
To ensure efficient communication, the TCP protocol incorporates several mechanisms that determine the amount of data (e.g., bytes) that may be transmitted in a single data packet, the flow or rate at which multiple packets are exchanged between the devices, and the effect of the packet transmissions on overall network congestion.
For example, the maximum amount of payload data that a sending device may transmit in the data portion of a single data packet to a receiving device is governed by the maximum segment size (“MSS”) value. By convention, the default MSS value is typically understood to be 1430-1460 bytes, but a larger or smaller MSS value may be set by the receiving device (based on its capabilities to receive a larger or smaller amount of data from the sending device in a single packet) and communicated to the sending device during the initial process of establishing the TCP connection. Once the MSS value is established, a sending device may not transmit a data packet where the data portion of the packet contains an amount of payload data exceeding the MSS value of the receiving device.
Another mechanism provided by the TCP/IP protocol to ensure reliable communication between two devices communicating over the network in accordance with the protocol is the acknowledgement mechanism, where each device acknowledges the reception of data received from the other device. For efficiency and in order to reduce network congestion, the receiving device typically does not send a separate acknowledgement for each data packet that it receives from the sending device. Rather, the acknowledgement mechanism of the TCP protocol is conventionally implemented such that the receiving device will delay transmitting an acknowledgment until it receives at least two data packets from the sending device. The delayed acknowledgement, when transmitted, typically acknowledges the reception of the data contained in two consecutive packets.
A sending device can often fit all of its data into a single packet, in which case it has only one packet to send. Accordingly, if the receiving device receives the first packet but does not receive a second packet, the receiving device will send an acknowledgement indicating the reception of the first packet after waiting for a prescribed amount of time (typically around 200 ms) for the second packet to arrive.
If the data acknowledged by the receiving device does not match the data that was transmitted (for example, if the receiving device only acknowledges the data in one packet when two data packets were transmitted by the server), the sending device retransmits the unacknowledged data packet to the receiving device, until all transmitted data is successfully acknowledged by the receiving device. Furthermore, if the sending device does not receive an acknowledgement within a prescribed period of time (because, for example, the client's acknowledgement packet is lost in transmission, or because none of the data packets transmitted by the server were received at the client device), the sending device retransmits unacknowledged data packets to the receiving device after waiting for an acknowledgement for a prescribed amount of time. The amount of time that the sending device waits prior to retransmitting the unacknowledged data packet is dynamically determined by the sending device based on estimated network conditions.
The mechanism known as the congestion window (“CW”) is another aspect of the TCP protocol that is designed to increase efficiency. Rather than defining the maximum size of the packet, the CW defines the maximum amount of data that a sending device (e.g., a server) may transmit at any given time to a receiving device (e.g., a client) before having to wait for an authorization from the receiving device to send more. In this regard, the CW comprises the maximum number of unacknowledged packets that a sending device may transmit to a receiving device in series prior to having to wait for an acknowledgement from the receiving device, where the maximum amount of data contained in each of the transmitted packets is based upon the MSS value of the receiving device.
In particular, some conventional implementations of the TCP/IP protocol set the CW to an initial default value of two (2) packets. Thus, a sending device may initially send two unacknowledged data packets to a receiving device and then must wait for an acknowledgement of those packets prior to sending any remaining packets. Upon receiving an acknowledgement for the initial two packets, the sending device may increase the value CW and transmit a larger number of the remaining packets in series prior to having to again wait for another acknowledgement from the receiving device.
The value of CW is typically increased by the number of packets that are acknowledged. Thus, for example, once the server receives an acknowledgement indicating the reception of the initial two packets, the server may increase the initial CW value (2 packets) by the number of acknowledged packets (2 packets), resulting in a new CW value of four (4) packets. Consequently, the server may now transmit four packets in a sequence to the client prior to having to wait for another acknowledgment.
The process of increasing the value of CW by the number of the acknowledged packets can theoretically continue indefinitely, until all available payload data has been successfully transmitted from the sending device to the receiving device. In the event that the sending device determines that one or more transmitted packets have been lost (i.e., because the transmitted packets have not been acknowledged by the receiving device within a prescribed period of time or because a negative acknowledgement is received), the value of CW is conventionally reduced by half (attributing the loss to congestion on the network) and the unacknowledged packets are retransmitted by the sending device in accordance with the reduced value of CW.